package persistencia;


import bitclub.*;
import java.sql.*;
import java.text.*;
import java.util.*;
import java.util.Date;

/**
 *@author José Manuel Domínguez Carvajal
 * @fecha 26/09/2011
 * @version 1.0
 */
public class PPelicula {

    /**
     * Introduce un objeto Pelicula en la base de datos 
     */
    public static void nuevoBD(Pelicula pelicula) {
        
        //Guardamos en la base de datos una nueva pelicula
        
        Connection conexion;
        Statement st = null;
        ResultSet rs = null;

        DateFormat df = new SimpleDateFormat("yyyy/MM/dd");

        try {

            Class.forName("com.mysql.jdbc.Driver");
            conexion = DriverManager.getConnection("jdbc:mysql://192.168.1.21/bitclub", "bituser", "bituser"); 
            st = conexion.createStatement();   
            
            // Guardamos en variables los datos que trae la pelicula para el insert values ...
            
            int id = pelicula.getId();
            String titulo = pelicula.getTitulo();
            String genero = pelicula.getGenero();
            int ano = pelicula.getAno();
            int clasificacion = pelicula.getClasificacionEdad();            
            int duracion = pelicula.getDuracion();
            String formato = pelicula.getFormato();
            String interpretes = pelicula.getInterpretes();
            String nacionalidad = pelicula.getNacionalidad();
            Date fecha_alta = pelicula.getFechaAlta();
            Date fecha_baja = pelicula.getFechaBaja();
            int tarifa_id = pelicula.getTarifa().getId();
            int v_alquilada = pelicula.getVecesAlquilada();
            boolean disponible = pelicula.isDisponible();
            int d;
            boolean activo = pelicula.isActivo();
            int a;
            
            /* La siguiente comprobación es porque en la base de datos, el dato 
             * booleano se guarda como un entero( 0 - Falso y 1 - Verdadero )
             * Con lo cual pasamos el booleano a 0 y 1 con las variables d(disponible)
             * y a de Activo
             */
            
            if (disponible == true) {
                d = 1;
                
            } else {
                d = 0;
            }
            
            if (activo == true) {
                a = 1;
                
            } else {
                a = 0;
            }
            
            // Pasamos la cadena del insert para la base de datos.
            
            st.executeUpdate("INSERT INTO PELICULAS VALUES (" + id + ", '" + titulo + "', '" + genero + "', '" + ano 
                 + clasificacion  + duracion  + ", '" + formato + "', '" + interpretes + "', '" + nacionalidad + "', " 
                 + df.format(fecha_alta) + df.format(fecha_baja) + tarifa_id + v_alquilada + d + a + ")" );
            
            System.out.println("Inserción Finalizada.");

        } catch (Exception ex) {

        } finally {
            try {
                rs.close();
            } catch (Exception ex) {
                //Logger.getLogger(PersistenciaPrueba.class.getName()).log(Level.SEVERE, null, ex);
                System.out.println("Mensaje de Error");
            }

       }

    }

    /**
     * Actualiza un objeto Pelicula en la base de datos 
     */
    public static void actualizarBD(Pelicula pelicula) {
        
        //Guardamos en la base de datos una nueva pelicula
        
        Connection conexion;
        Statement st = null;
        ResultSet rs = null;

        DateFormat df = new SimpleDateFormat("yyyy/MM/dd");

        try {

            Class.forName("com.mysql.jdbc.Driver");
            conexion = DriverManager.getConnection("jdbc:mysql://192.168.1.21/bitclub", "bituser", "bituser"); 
            st = conexion.createStatement();   
            
            // Guardamos en variables los datos que trae la pelicula para el insert values ...
            
            int id = pelicula.getId();
            String titulo = pelicula.getTitulo();
            String genero = pelicula.getGenero();
            int ano = pelicula.getAno();
            int clasificacion = pelicula.getClasificacionEdad();            
            int duracion = pelicula.getDuracion();
            String formato = pelicula.getFormato();
            String interpretes = pelicula.getInterpretes();
            String nacionalidad = pelicula.getNacionalidad();
            Date fecha_alta = pelicula.getFechaAlta();
            Date fecha_baja = pelicula.getFechaBaja();
            int tarifa_id = pelicula.getTarifa().getId();
            int v_alquilada = pelicula.getVecesAlquilada();
            boolean disponible = pelicula.isDisponible();
            int d;
            boolean activo = pelicula.isActivo();
            int a;
            
            /* La siguiente comprobación es porque en la base de datos, el dato 
             * booleano se guarda como un entero( 0 - Falso y 1 - Verdadero )
             * Con lo cual pasamos el booleano a 0 y 1 con las variables d(disponible)
             * y a de Activo
             */
            
            if (disponible == true) {
                d = 1;
                
            } else {
                d = 0;
            }
            
            if (activo == true) {
                a = 1;
                
            } else {
                a = 0;
            }
            
            // Pasamos la cadena del UPDATE para la base de datos.
            
            st.executeUpdate("UPDATE PELICULAS SET ID = " + id + ", TITULO = '" + titulo + "', GENERO = '" + genero 
                 + "', AÑO = " + ano + ", CLASIFICACION = " + clasificacion  + ", DURACION = " + duracion  
                 + ", FORMATO =  '" + formato + "', INTERPRETES = '" + interpretes + "', NACIONALIDAD = '" 
                 + nacionalidad + "', FECHA_ALTA =  " + df.format(fecha_alta) + ", FECHA_BAJA = " + df.format(fecha_baja) 
                 + ", TARIFA_ID = " + tarifa_id + ", V_ALQUILADA = " + v_alquilada + ", DISPONIBLE = " + d + ", ACTIVO = " + a + ")" );
                        
            System.out.println("Inserción Finalizada.");

        } catch (Exception ex) {

        } finally {
            try {
                rs.close();
            } catch (Exception ex) {
                //Logger.getLogger(PersistenciaPrueba.class.getName()).log(Level.SEVERE, null, ex);
                System.out.println("Mensaje de Error");
            }

       }
        
    }

    /**
     * Obtiene de la base de datos una lista de artículos que son los más alquilados
     * @return Lista<Pelicula>
     */
    public static List<Pelicula> seleccionarPorMasAlquiladosBD() {

        List<Pelicula> listPelicula = new ArrayList();
        
        Connection connection =null;
        Statement statement = null;
        ResultSet rs = null;             
                
        DateFormat df = new SimpleDateFormat("yyyy/MM/dd");  

        try {
            
            Pelicula pelicula = new Pelicula();
            Proveedor proveedor;
            Tarifa tarifa;

            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql://192.168.1.21/bitclub", "bituser", "bituser"); 
            statement = connection.createStatement();
            rs = statement.executeQuery("SELECT ID, TITULO, GENERO, ANO, CLASIFICACION, DURACION, FORMATO, INTERPRETES, NACIONALIDAD, FECHA_ALTA, FECHA_BAJA, TARIFA_ID, V_ALQUILADA, DISPONIBLE, ACTIVO FROM PELICULAS ORDER BY V_ALQUILADA LIMIT 10 ");

            while (rs.next()) {
                                                                                
                pelicula.setId(rs.getInt("id"));                
                pelicula.setTitulo(rs.getString("titulo"));
                pelicula.setGenero(rs.getString("genero"));
                pelicula.setClasificacionEdad(rs.getInt("clasificacion"));
                pelicula.setDuracion(rs.getInt("duracion"));
                pelicula.setFormato(rs.getString("formato"));
                pelicula.setInterpretes(rs.getString("interpretes"));
                pelicula.setNacionalidad(rs.getString("nacionalidad"));
                pelicula.setFechaAlta(df.parse(rs.getString("fecha_alta")));
                pelicula.setFechaBaja(df.parse(rs.getString("fecha_baja")));
                
                // pedir a la clase de persistencia dametarifa y dameproveedor.                
                //pelicula.setTarifa(rs.getInt("tarifa_id"));
                //pelicula.setProveedor(rs.getInt("proveedor_id"));
                
                pelicula.setVecesAlquilada(rs.getInt("v_alquilada")); 
                
                int disponible=rs.getInt("disponible");
                int activo=rs.getInt("activo");
                
                if(disponible==1){
                    
                     pelicula.setDisponible(true);
                
                }else{
                    
                     pelicula.setDisponible(false);
                }
                
                if(activo==1){
                    
                     pelicula.setActivo(true);
                
                }else {
                
                     pelicula.setActivo(false);
                    
                }                
               
            } 
            
                listPelicula.add(pelicula);

        } catch (Exception ex) {
            System.out.println("Fallo en la conexión.");
        } finally {
            try {
                rs.close();
            } catch (SQLException ex) {
                System.out.println("Mensaje de Error en la consulta.");
            }
            
        }

        return listPelicula;
    
    }

    /**
     * Obtiene de la base de datos una lista de películas que son los menos alquilados
     * @return Lista<Pelicula>
     */
    public static List<Pelicula> seleccionarPorMenosAlquiladosBD() {
        
        List<Pelicula> listPelicula = new ArrayList();
        
        Connection connection =null;
        Statement statement = null;
        ResultSet rs = null;             
                
        DateFormat df = new SimpleDateFormat("yyyy/MM/dd");  

        try {
            
            Pelicula pelicula = new Pelicula();
            Proveedor proveedor;
            Tarifa tarifa;

            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql://192.168.1.21/bitclub", "bituser", "bituser"); 
            statement = connection.createStatement();
            rs = statement.executeQuery("SELECT ID, TITULO, GENERO, ANO, CLASIFICACION, DURACION, FORMATO, INTERPRETES, NACIONALIDAD, FECHA_ALTA, FECHA_BAJA, TARIFA_ID, V_ALQUILADA, DISPONIBLE, ACTIVO FROM PELICULAS ORDER BY V_ALQUILADA DESC LIMIT 10 ");

            while (rs.next()) {
                                                                                
                pelicula.setId(rs.getInt("id"));                
                pelicula.setTitulo(rs.getString("titulo"));
                pelicula.setGenero(rs.getString("genero"));
                pelicula.setClasificacionEdad(rs.getInt("clasificacion"));
                pelicula.setDuracion(rs.getInt("duracion"));
                pelicula.setFormato(rs.getString("formato"));
                pelicula.setInterpretes(rs.getString("interpretes"));
                pelicula.setNacionalidad(rs.getString("nacionalidad"));
                pelicula.setFechaAlta(df.parse(rs.getString("fecha_alta")));
                pelicula.setFechaBaja(df.parse(rs.getString("fecha_baja")));
                
                // pedir a la clase de persistencia dametarifa y dameproveedor.                
                //pelicula.setTarifa(rs.getInt("tarifa_id"));
                //pelicula.setProveedor(rs.getInt("proveedor_id"));
                
                pelicula.setVecesAlquilada(rs.getInt("v_alquilada")); 
                
                int disponible=rs.getInt("disponible");
                int activo=rs.getInt("activo");
                
                if(disponible==1){
                    
                     pelicula.setDisponible(true);
                
                }else{
                    
                     pelicula.setDisponible(false);
                }
                
                if(activo==1){
                    
                     pelicula.setActivo(true);
                
                }else {
                
                     pelicula.setActivo(false);
                    
                }                
               
            } 
            
                listPelicula.add(pelicula);

        } catch (Exception ex) {
            System.out.println("Fallo en la conexión.");
        } finally {
            try {
                rs.close();
            } catch (SQLException ex) {
                System.out.println("Mensaje de Error en la consulta.");
            }
            
        }

        return listPelicula;        
    }

    /**
     * Obtiene de la base de datos la película cuyo código es el seleccionado
     * @return Pelicula
     */
    public static Pelicula seleccionarPorCodigoBD(int codigo) {
        
        Pelicula pelicula = new Pelicula();
        Proveedor proveedor;
        Tarifa tarifa;
        
        Connection conexion;
        Statement st = null;
        ResultSet rs = null;
                        
        DateFormat df = new SimpleDateFormat("yyyy/MM/dd");        
                       
        try {

            Class.forName("com.mysql.jdbc.Driver");
            conexion = DriverManager.getConnection("jdbc:mysql://192.168.1.21/bitclub", "bituser", "bituser"); 
            st = conexion.createStatement();
            rs = st.executeQuery("SELECT ID, TITULO, GENERO, ANO, CLASIFICACION, DURACION, FORMATO, INTERPRETES, NACIONALIDAD, FECHA_ALTA, FECHA_BAJA, TARIFA_ID, V_ALQUILADA, DISPONIBLE, ACTIVO FROM PELICULAS WHERE CODIGO = " + codigo);
            
            if (rs.next()) {                                        
                
                pelicula.setId(rs.getInt("id"));                
                pelicula.setTitulo(rs.getString("titulo"));
                pelicula.setGenero(rs.getString("genero"));
                pelicula.setClasificacionEdad(rs.getInt("clasificacion"));
                pelicula.setDuracion(rs.getInt("duracion"));
                pelicula.setFormato(rs.getString("formato"));
                pelicula.setInterpretes(rs.getString("interpretes"));
                pelicula.setNacionalidad(rs.getString("nacionalidad"));
                pelicula.setFechaAlta(df.parse(rs.getString("fecha_alta")));
                pelicula.setFechaBaja(df.parse(rs.getString("fecha_baja")));
                
                //pedir a la clase de persistencia dametarifa y dameproveedor.                
                //pelicula.setTarifa(rs.getInt("tarifa_id"));
                //pelicula.setProveedor(rs.getInt("proveedor_id"));
                
                pelicula.setVecesAlquilada(rs.getInt("v_alquilada")); 
                
                int disponible=rs.getInt("disponible");
                int activo=rs.getInt("activo");
                
                if(disponible==1){
                    
                    pelicula.setDisponible(true);
                
                }else{
                    
                    pelicula.setDisponible(false);
                }
                
                if(activo==1){
                    
                    pelicula.setActivo(true);
                
                }else {
                
                    pelicula.setActivo(false);
                    
                }                
                
            } else {
                
                return null;
            }
            
        } catch (Exception ex) {

        } finally {
            try {
                rs.close();
            } catch (Exception ex) {                
                System.out.println("Mensaje de Error en la consulta.");
            }
       }        
        //Devolver el objeto de tipo Videoclub
        return pelicula;
        
    }

    /**
     * Obtiene de la base de datos una lista de películas cuyo titulo coincide con ciertas palabras
     * @return Lista<Pelicula>
     */
    public static List<Pelicula> seleccionarPorTituloBD(String titulo) {
        
        List<Pelicula> listPelicula = new ArrayList();
        
        Connection connection =null;
        Statement statement = null;
        ResultSet rs = null;
        
        DateFormat df = new SimpleDateFormat("yyyy/MM/dd");  

        try {
            
            Pelicula pelicula = new Pelicula();                            
            Proveedor proveedor;
            Tarifa tarifa;

            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql://192.168.1.21/bitclub", "bituser", "bituser"); 
            statement = connection.createStatement();
            rs = statement.executeQuery("SELECT ID, TITULO, GENERO, ANO, CLASIFICACION, DURACION, FORMATO, INTERPRETES, NACIONALIDAD, FECHA_ALTA, FECHA_BAJA, TARIFA_ID, V_ALQUILADA, DISPONIBLE, ACTIVO FROM PELICULAS WHERE TITULO LIKE " + '%' + titulo + '%');

            while (rs.next()) {
                                                                                
                pelicula.setId(rs.getInt("id"));                
                pelicula.setTitulo(rs.getString("titulo"));
                pelicula.setGenero(rs.getString("genero"));
                pelicula.setClasificacionEdad(rs.getInt("clasificacion"));
                pelicula.setDuracion(rs.getInt("duracion"));
                pelicula.setFormato(rs.getString("formato"));
                pelicula.setInterpretes(rs.getString("interpretes"));
                pelicula.setNacionalidad(rs.getString("nacionalidad"));
                pelicula.setFechaAlta(df.parse(rs.getString("fecha_alta")));
                pelicula.setFechaBaja(df.parse(rs.getString("fecha_baja")));
                
                // pedir a la clase de persistencia dametarifa y dameproveedor.
                
                //pelicula.setTarifa(rs.getInt("tarifa_id"));
                //pelicula.setProveedor(rs.getInt("proveedor_id"));
                
                 pelicula.setVecesAlquilada(rs.getInt("v_alquilada")); 
                
                int disponible=rs.getInt("disponible");
                int activo=rs.getInt("activo");
                
                if(disponible==1){
                    
                     pelicula.setDisponible(true);
                
                }else{
                    
                     pelicula.setDisponible(false);
                }
                
                if(activo==1){
                    
                     pelicula.setActivo(true);
                
                }else {
                
                     pelicula.setActivo(false);
                    
                }                
               
            } 
            
                listPelicula.add(pelicula);

        } catch (Exception ex) {
            System.out.println("Fallo en la conexión.");
        } finally {
            try {
                rs.close();
            } catch (SQLException ex) {
                System.out.println("Mensaje de Error en la consulta.");
            }
            
        }

        return listPelicula;
    }

    /**
     * Obtiene de la base de datos una lista de peliculas que pertenecen a cierto género
     * @return Lista<Pelicula>
     */
    public static List<Pelicula> seleccionarPorGeneroBD(String genero) {
        
        List<Pelicula> listPelicula = new ArrayList();
        
        Connection connection =null;
        Statement statement = null;
        ResultSet rs = null;             
                
        DateFormat df = new SimpleDateFormat("yyyy/MM/dd");  

        try {
            
            Pelicula pelicula = new Pelicula();
            Proveedor proveedor;
            Tarifa tarifa;

            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql://192.168.1.21/bitclub", "bituser", "bituser"); 
            statement = connection.createStatement();
            rs = statement.executeQuery("SELECT ID, TITULO, GENERO, ANO, CLASIFICACION, DURACION, FORMATO, INTERPRETES, NACIONALIDAD, FECHA_ALTA, FECHA_BAJA, TARIFA_ID, V_ALQUILADA, DISPONIBLE, ACTIVO FROM PELICULAS WHERE GENERO = " + genero);

            while (rs.next()) {
                                                                                
                pelicula.setId(rs.getInt("id"));                
                pelicula.setTitulo(rs.getString("titulo"));
                pelicula.setGenero(rs.getString("genero"));
                pelicula.setClasificacionEdad(rs.getInt("clasificacion"));
                pelicula.setDuracion(rs.getInt("duracion"));
                pelicula.setFormato(rs.getString("formato"));
                pelicula.setInterpretes(rs.getString("interpretes"));
                pelicula.setNacionalidad(rs.getString("nacionalidad"));
                pelicula.setFechaAlta(df.parse(rs.getString("fecha_alta")));
                pelicula.setFechaBaja(df.parse(rs.getString("fecha_baja")));
                
                // pedir a la clase de persistencia dametarifa y dameproveedor.                
                //pelicula.setTarifa(rs.getInt("tarifa_id"));
                //pelicula.setProveedor(rs.getInt("proveedor_id"));
                
                pelicula.setVecesAlquilada(rs.getInt("v_alquilada")); 
                
                int disponible=rs.getInt("disponible");
                int activo=rs.getInt("activo");
                
                if(disponible==1){
                    
                     pelicula.setDisponible(true);
                
                }else{
                    
                     pelicula.setDisponible(false);
                }
                
                if(activo==1){
                    
                     pelicula.setActivo(true);
                
                }else {
                
                     pelicula.setActivo(false);
                    
                }                
               
            } 
            
                listPelicula.add(pelicula);

        } catch (Exception ex) {
            System.out.println("Fallo en la conexión.");
        } finally {
            try {
                rs.close();
            } catch (SQLException ex) {
                System.out.println("Mensaje de Error en la consulta.");
            }
            
        }

        return listPelicula;
    }   

    /**
     * Obtiene de la base de datos una lista de películas que se lanzaron en cierto año
     * @return Lista<Pelicula>
     */
    public static List<Pelicula> seleccionarPorAnoBD(int ano) {
        
        List<Pelicula> listPelicula = new ArrayList();
        
        Connection connection =null;
        Statement statement = null;
        ResultSet rs = null;             
                
        DateFormat df = new SimpleDateFormat("yyyy/MM/dd");  

        try {
            
            Pelicula pelicula = new Pelicula();
            Proveedor proveedor;
            Tarifa tarifa;

            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection("jdbc:mysql://192.168.1.21/bitclub", "bituser", "bituser"); 
            statement = connection.createStatement();
            rs = statement.executeQuery("SELECT ID, TITULO, GENERO, ANO, CLASIFICACION, DURACION, FORMATO, INTERPRETES, NACIONALIDAD, FECHA_ALTA, FECHA_BAJA, TARIFA_ID, V_ALQUILADA, DISPONIBLE, ACTIVO FROM PELICULAS WHERE ANO = " + ano);

            while (rs.next()) {
                                                                                
                pelicula.setId(rs.getInt("id"));                
                pelicula.setTitulo(rs.getString("titulo"));
                pelicula.setGenero(rs.getString("genero"));
                pelicula.setClasificacionEdad(rs.getInt("clasificacion"));
                pelicula.setDuracion(rs.getInt("duracion"));
                pelicula.setFormato(rs.getString("formato"));
                pelicula.setInterpretes(rs.getString("interpretes"));
                pelicula.setNacionalidad(rs.getString("nacionalidad"));
                pelicula.setFechaAlta(df.parse(rs.getString("fecha_alta")));
                pelicula.setFechaBaja(df.parse(rs.getString("fecha_baja")));
                
                // pedir a la clase de persistencia dametarifa y dameproveedor.                
                //pelicula.setTarifa(rs.getInt("tarifa_id"));
                //pelicula.setProveedor(rs.getInt("proveedor_id"));
                
                pelicula.setVecesAlquilada(rs.getInt("v_alquilada")); 
                
                int disponible=rs.getInt("disponible");
                int activo=rs.getInt("activo");
                
                if(disponible==1){
                    
                     pelicula.setDisponible(true);
                
                }else{
                    
                     pelicula.setDisponible(false);
                }
                
                if(activo==1){
                    
                     pelicula.setActivo(true);
                
                }else {
                
                     pelicula.setActivo(false);
                    
                }                
               
            } 
            
                listPelicula.add(pelicula);

        } catch (Exception ex) {
            System.out.println("Fallo en la conexión.");
        } finally {
            try {
                rs.close();
            } catch (SQLException ex) {
                System.out.println("Mensaje de Error en la consulta.");
            }
            
        }

        return listPelicula;
    }
}